package com.example.lib.muchthread;

/**
 * 同步函数用的锁是哪一个呢？
 * 函数需要被对象调用。那么函数都有一个所属对象引用，就是this。
 * 所以同步函数使用的锁是this。
 *
 * 通过该程序进行验证。
 * 使用两个线程卖票。
 * 一个线程在同步代码块中，一个线程在同步函数中。
 * 都在执行卖票动作。
 */

public class i_sync_method_this_138 {
    public static void main(String[] args) {
        Ticket138 runnable = new Ticket138();

        Thread t1 = new Thread(runnable);
        Thread t2 = new Thread(runnable);

        t1.start();
        try {Thread.sleep(10);} catch (InterruptedException e) {throw new RuntimeException(e);}
        runnable.flag=false;
        t2.start();

    }
}

class Ticket138 implements Runnable {

    private int tick = 100;
//    Object object=new Object();
    boolean flag=true;
    @Override
    public void run() {

        if (flag){
            while (true){
//               synchronized (object){
               synchronized (this){
                   if (tick > 0) {
                       try {
                           Thread.sleep(10);
                       } catch (InterruptedException e) {
                           throw new RuntimeException(e);
                       }
                       System.out.println(Thread.currentThread().getName() + "...同步代码块:" + tick--);
                   }
               }
            }
        }else {
            while (true) {
                show();
            }
        }
    }

    public synchronized void show(){
        if (tick > 0) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName() + "......同步函数:" + tick--);
        }
    }
}